// #ifndef POLLER
// #define POLLER

// #include "Common.h"
// #include <sys/epoll.h>
// #include <sys/eventfd.h>
// #include <unordered_map>

// class Channel;
// /**
//  * fd事件监控
//  * 工作模式的选择，是选择ET还是LT
//  */
// const int EpollSize = 1024;

// class Poller
// {
// private:
//     int _epollfd = DefaultFD;
//     std::vector<struct epoll_event> _event;
//     // 管理fd以及对于的Channel对象
//     std::unordered_map<int, Channel *> _channels;

// public:
//     Poller()
//     {
//         _epollfd = epoll_create(EpollSize);
//         if (_epollfd < 0)
//         {
//             ERR_LOG("epollfd 创建失败\n");
//             exit(static_cast<int>(PollerExitCode::CRE_EPOLLFD_FAIL));
//         }
//     }
//     Poller(const Poller &) = delete;
//     Poller &operator=(const Poller &) = delete;
//     ~Poller()
//     {
//         if (_epollfd > 0)
//             ::close(_epollfd);
//     }

//     void UpdateEvents(Channel *channel)
//     {
//         int fd = channel->getFd();
//         if (!HasChannel(fd))
//         {
//             _channels[fd] = channel;
//             Update(EPOLL_CTL_ADD, channel);
//         }
//         else
//             Update(EPOLL_CTL_MOD, channel);
//     }

//     void RemoveEvents(Channel *channel)
//     {
//         int fd = channel->getFd();
//         if (!HasChannel(fd))
//             return;
//         _channels.erase(fd);
//         Update(EPOLL_CTL_DEL, channel);
//     }

//     // 返回活跃的数组
//     void Poll(std::vector<Channel *> *active)
//     {
//         int nfds = epoll_wait(_epollfd, _event.data(), _event.size(), -1);
//         if (nfds < 0)
//         {
//             if (errno != EINTR)
//             {
//                 ERR_LOG("epoll_wait 错误 %s\n", strerror(errno));
//             }
//         }

//         for (int i = 0; i < nfds; i++)
//         {
//             Channel *channel = static_cast<Channel *>(_event[i].data.ptr);
//             channel->setRevents(_event[i].events);
//             active->push_back(channel);
//         }

//         if (nfds == _event.size())
//             _event.resize(_event.size() * 2);
//     }

// private:
//     void Update(int flag, Channel *channel)
//     {
//         int fd = channel->getFd();
//         struct epoll_event event;
//         event.events = channel->getEvents();
//         event.data.ptr = channel;
//         // event.data.fd = fd;

//         int ret = epoll_ctl(_epollfd, flag, fd, &event);
//         if (ret < 0)
//         {
//             if (flag == EPOLL_CTL_DEL)
//             {
//                 ERR_LOG("epoll_ctl(DEL) 失败, fd=%d\n", fd);
//                 exit(static_cast<int>(PollerExitCode::EPOLL_CTL_DEL_FAIL));
//             }
//             else
//             {
//                 ERR_LOG("epoll_ctl(ADD/MOD) 失败, fd=%d\n", fd);
//                 exit(static_cast<int>(PollerExitCode::EPOLL_CTL_ADD_FAIL) + static_cast<int>(PollerExitCode::EPOLL_CTL_MOD_FAIL));
//             }
//         }
//     }

//     bool HasChannel(int fd)
//     {
//         auto it = _channels.find(fd);
//         if (it == _channels.end())
//             return false;
//         return true;
//     }
// };

// #endif

#ifndef POLLER
#define POLLER

#include "Common.h"
#include <sys/epoll.h>
#include <unordered_map>

class Channel; // 保持前向声明

const int EpollSize = 1024;

class Poller
{
private:
    int _epollfd = DefaultFD;
    std::vector<struct epoll_event> _events;
    std::unordered_map<int, Channel *> _channels;

public:
    Poller(); // 构造函数实现也移到 cpp
    ~Poller();

    Poller(const Poller &) = delete;
    Poller &operator=(const Poller &) = delete;

    // --- 只保留声明 ---
    void UpdateEvents(Channel *channel);
    void RemoveEvents(Channel *channel);
    void Poll(std::vector<Channel *> *active);

private:
    // --- 只保留声明 ---
    bool Update(int flag, Channel *channel);
    bool HasChannel(int fd);
};

#endif